﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

// Reviewed

#pragma once

#include "ICurve3d.h"

namespace gcmp
{
    /// \brief 三维直线
    ///
    class ILine3d : public ICurve3d
    {
    public:
        /// \brief  根据起始点，终点创建三维直线段
        /// \param startPoint    起始点
        /// \param endPoint      终点
        /// \return  三维直线
        /// \see 如果起始点和终点重合，返回退化的直线
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<ILine3d> Create(const Vector3d& startPoint, const Vector3d& endPoint);

        /// \brief  通过基准点，直线单位化矢量方向，以及直线沿着矢量方向上的起点和终点区间，创建三维直线段
        /// \param position            基准点
        /// \param normalizedDirection 单位化的方向矢量
        /// \param range               起点与终点距离基点的长度范围区间(目前是弧长参数，参数间隔即长度)
        /// \return  三维直线
        /// \see 如果起始点和终点重合，返回退化的直线
        GCMP_GEOMETRY_INTERFACE_EXPORT static OwnerPtr<ILine3d> Create(const Vector3d& position, const Vector3d& normalizedDirection, const Intervald& range);



        DEFINE_CAST_DERIVED(gcmp::ILine3d, gcmp::ICurve3d);
    public:

        /// \brief  设置直线的起点和终点。起点和终点可以相同，这时候发生退化
        /// \param startPoint  起点
        /// \param endPoint    终点
        /// \return 成功返回true,否则返回false(默认返回True)
        virtual bool Set(
            const Vector3d& startPoint,
            const Vector3d& endPoint
        ) = 0;

        /// \brief  获取直线的基点
        /// \return 基点
        virtual Vector3d GetOrigin() const = 0;

        /// \brief  设置直线的基点
        /// \param origin  基点
        /// \return 成功返回true,否则返回false(默认返回True)
        virtual bool SetOrigin(const Vector3d& origin) = 0;

        /// \brief  获取直线的方向
        /// \return 直线方向
        virtual Vector3d GetDirection() const = 0;

        /// \brief  设置直线的方向
        /// \param direction  方向
        /// \return 成功返回true,否则返回false(默认返回True)
        virtual bool SetDirection(const Vector3d& direction) = 0;


    public:
        virtual ~ILine3d() {}
    };
}

